home *** CD-ROM | disk | FTP | other *** search
/ Aminet 32 / Aminet 32 (1999)(Schatztruhe)[!][Aug 1999].iso / Aminet / biz / dopus / dopus_undms.lha / undms.dopus5 < prev   
Text File  |  1999-05-13  |  4KB  |  155 lines

  1. /*
  2.  * $VER: undms.dopus5 2.21 (13.05.99)
  3.  *
  4.  * ARexx script for DOpus 5.8+
  5.  * Enhanced for DOpus5.8+ by A Niven-Jenkins © 1999 Cremlin Software
  6.  * Original script by Edmund Vermeulen
  7.  *
  8.  * Unpacks a DMS file to disk with progress indication
  9.  *
  10.  * ARexx: <path>undms.dopus5 {Qp} {f}
  11.  * Flags: Run asynchronously
  12.  *
  13.  */
  14.  
  15. PARSE ARG dopusport filepath .
  16.  
  17. OPTIONS RESULTS
  18.  
  19. SIGNAL ON ioerr
  20.  
  21. /* initial variable values */
  22. filepath=STRIP(filepath, 'B', '"')
  23. devices='_DF0 D_F1'
  24. automount='FF_0 FF_1'
  25. lf='0a'x
  26. buttons=''
  27. num=0
  28. break=0
  29. errorreport=''
  30. buffer=''
  31.  
  32. ADDRESS VALUE dopusport
  33.  
  34. /* get filename from complete path */
  35. charpos=LASTPOS('/', filepath)
  36. IF charpos=0 THEN charpos=POS(':', filepath)
  37. filename=SUBSTR(filepath, charpos+1)
  38.  
  39. /* only show devices which are actually available */
  40. DO WHILE devices~=''
  41.  PARSE VAR devices devbutton devices
  42.  dest=COMPRESS(devbutton, '_')
  43.  IF SHOWLIST('H', dest) THEN DO
  44.   num=num+1
  45.   dest.num=dest || ':'
  46.   buttons=buttons || devbutton || ' |'
  47.  END
  48. END
  49.  
  50. /* add automount devices */
  51. DO WHILE automount~=''
  52.  num=num+1
  53.  PARSE VAR automount devbutton automount
  54.  dest.num=COMPRESS(devbutton, '_') || ':'
  55.  buttons=buttons || devbutton || ' |'
  56. END
  57.  
  58. DOPUS REQUEST '"Please select destination for ' || filename || '" ' || buttons || ' _Cancel'
  59.  
  60. /* if cancel wasn't clicked carry on */
  61. IF RC>0 THEN DO
  62.  
  63.  /* get device from button cicked */
  64.  devname=dest.RC
  65.  
  66.  /* if device is an automount, mount it */
  67.  IF ~SHOWLIST('H', devname) THEN ADDRESS COMMAND 'Mount' devname
  68.  
  69.  /* setup progress bar */
  70.  DOPUS PROGRESS INFO BAR ABORT
  71.  handle=RESULT
  72.  DOPUS PROGRESS handle title 'Unpacking ' || filename || '...'
  73.  
  74.  /* start running DMS via PIPE: */
  75.  ADDRESS COMMAND 'Run >T:UnDMS.' || handle || ' <NIL: DMS <NIL: >PIPE:dmsout.' || handle || ' WRITE "' || filepath || '" TO ' || devname || ' NOTEXT'
  76.  
  77.  /* get CLI process number */
  78.  OPEN('tempfile', 'T:UnDMS.' || handle, 'R')
  79.  PROCESS=READLN('tempfile')
  80.  PARSE VAR PROCESS '[CLI ' process ']'
  81.  CLOSE('tempfile')
  82.  DELETE('T:UnDMS.' || handle)
  83.  
  84.  /* read in PIPE: information so that the progress bar can be updated */
  85.  OPEN('dmsout', 'PIPE:dmsout.' || handle, 'R')
  86.  DO UNTIL EOF('dmsout')
  87.  
  88.   /* read in 25 characters at a time */
  89.   buffer=buffer || READCH('dmsout', 25)
  90.  
  91.   /* check for a new line */
  92.   newline=VERIFY(buffer, '0a0d'x, 'M')
  93.  
  94.   /* if we are on a newline */
  95.   IF newline>0 THEN DO
  96.  
  97.    /* one whole line */
  98.    line=LEFT(buffer, newline-1)
  99.  
  100.    /* was abort clicked */
  101.    DOPUS PROGRESS handle ABORT
  102.  
  103.    /* if it wasn't carry on */
  104.    IF RESULT=0 THEN DO
  105.  
  106.     /* no disk in drive */
  107.     IF LEFT(UPPER(line), 7)='NO DISK' THEN DOPUS PROGRESS handle INFO 'Please insert disk in ' || devname
  108.  
  109.     /* inserted disk is write protected */
  110.     IF POS('WRITE-PROTECTED', UPPER(line))>0 THEN DOPUS PROGRESS handle INFO 'Disk in ' || devname || ' is write protected.'
  111.  
  112.     /* get rid of some ugly stuff */
  113.     PARSE VAR line ' ' line
  114.     buffer=SUBSTR(buffer, newline+1)
  115.  
  116.     /* remember every line with the word 'error' in it */
  117.     IF POS('ERROR', UPPER(line))>0 THEN DO
  118.      errorreport=errorreport || lf || line
  119.      COMMAND FLASH
  120.     END
  121.  
  122.     /* update progress bar */
  123.     IF POS('UNPACKING', UPPER(line))>0 THEN DO
  124.      track=RIGHT(line, 2)
  125.      DOPUS PROGRESS handle INFO 'Track ' || track
  126.      DOPUS PROGRESS handle BAR 80 track+1
  127.     END
  128.    END
  129.  
  130.    ELSE DO
  131.     break=1
  132.     CALL endpart
  133.    END
  134.   END
  135.  END
  136.  
  137.  /* display error report */
  138.  IF errorreport~=='' THEN DOPUS REQUEST '"DMS error report for ' || dmsname || lf || errorreport || '" _OK'
  139.  
  140.  /* on error */
  141.  ioerr:;endpart:
  142.  
  143.  /* shut down DMS */
  144.  IF break=1 THEN DO
  145.   ADDRESS COMMAND 'Break ' || process || ' C'
  146.   CLOSE('dmsout')
  147.  END
  148.  
  149.  /* clean up */
  150.  DOPUS PROGRESS handle OFF
  151. END
  152.  
  153. /* end gracefully */
  154. EXIT 0
  155.